$(document).ready(function(){
  $(".button").click(function(){
  console.log("aaa");
  getCombBySum();
  });
});


function getCombBySum() {
	//var array=[43200,4998,2140.6,365,3200,41472,43250,389,828,384,1116,4141,15000,16100,3500,10800];
	//var sum = 184853.6;
	var array=[1929.53,1683.35,1302.58,300,360,360,62825.03,67650.69,12981.36,7213.92,79684.48,9175.21,6468.28,20633.8,7714.2,50624,42375,8787,23008.85,63999.94,28522.74,42047.31];
	var sum = 159078.31;
	var tolerance = 0;
	var targetCount=12;
	var util = {
			/*
			get combination from array
			arr: target array
			num: combination item length
			return: one array that contain combination arrays
			*/
			getCombination: function(array, num) {
				var r = [];
				(function f(t, a, n) {
					if(n == 0) {
						return r.push(t);
					}
					for(var i = 0, l = a.length; i <= l - n; i++) {
						f(t.concat(a[i]), a.slice(i + 1), n - 1);
					}
				})([], array, num);
				return r;
			},
			//take array index to a array
			getArrayIndex: function(array) {
				var i = 0,
					r = [];
				for(i = 0; i < array.length; i++) {
					r.push(i);
				}

				return r;
			}
		},
		logic = {
			//sort the array,then get what's we need
			init: function(array, sum) {
				//clone array
				var _array = array.concat(),
					r = [],
					i = 0;
				//sort by asc
				_array.sort(function(a, b) {
					return a - b;
				});
				//get all number when it's less than or equal sum
				for(i = 0; i < _array.length; i++) {
					if(_array[i] <= sum) {
						r.push(_array[i]);
					} else {
						break;
					}
				}

				return r;
			},
			//important function
			core: function(array, sum, arrayIndex, count, r) {
				var i = 0,
					k = 0,
					combArray = [],
					_sum = 0,
					_cca = [],
					_cache = [];

				if(count == _returnMark) {
					return;
				}
				//get current count combination
				combArray = util.getCombination(arrayIndex, count);
				for(i = 0; i < combArray.length; i++) {
					_cca = combArray[i];
					_sum = 0;
					_cache = [];
					//calculate the sum from combination
					for(k = 0; k < _cca.length; k++) {
						_sum += array[_cca[k]];
						_cache.push(array[_cca[k]]);
					}
					if(Math.abs(_sum - sum) <= _tolerance) {
						r.push(_cache);
					}
				}

				logic.core(array, sum, arrayIndex, count - 1, r);
			}

		},
		r = [],
		_array = [],
		_targetCount = 0,
		_tolerance = 0,
		_returnMark = 0;

	//check data
	_targetCount = targetCount || _targetCount;
	_tolerance = tolerance || _tolerance;

	_array = logic.init(array, sum);
	if(_targetCount) {
		_returnMark = _targetCount - 1;
	}

	logic.core(_array, sum, util.getArrayIndex(_array), (_targetCount || _array.length), r);

console.log(r);
	return r;
}